package es.deusto.ingenieria.is.search.tsp.formulation;

import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

import es.deusto.ingenieria.is.search.formulation.State;
import es.deusto.ingenieria.is.search.xml.StateXMLReader;

/**
 * @author Kevin e Inigo
 *Objeto que nos permite procesar un archivo .xml
 */
public class MapReader extends StateXMLReader{

	/**
	 * Numero de ciudades totales del entorno
	 */
	private int numeroCiudades;
	
	/**
	 * Objeto lista que almacena las posibles ciudades que debemos visitar partiendo de la ciudad inicial hasta llegar a la ciudad final
	 */
	private ArrayList<Ciudad> ciudades;
	
	/**
	 * Clase ciudad que contiene la ciudad de inicio del entrono.
	 */
	private Ciudad ciudadInicio;
	
	/**
	 * Clase ciudad que contiene la ciudad de fin del entrono
	 */
	private Ciudad ciudadFinal;

	/**Constructor del objeto MapReader, que recibe el path de un archivo .xml y se lo pasa a su padre para que lo procese.
	 * @param fileXML Ruta del fichero XML
	 */
	public MapReader(String fileXML) {
		super(fileXML);
		// TODO Auto-generated constructor stub
	}

	/* (non-Javadoc)
	 * Devuelve el entorno de nuestro problema.
	 * @see es.deusto.ingenieria.is.search.xml.StateXMLReader#getState()
	 * 
	 */
	@Override
	public State getState() {
		
		ArrayList<Ciudad>temporal=new ArrayList<Ciudad>();
		temporal.add(ciudadInicio);
		for(int i=0;i<ciudades.size();i++)
		{
			temporal.add(ciudades.get(i));
		}
		temporal.add(ciudadFinal);

		for(int i=0; i<numeroCiudades; i++)
		{

			ArrayList<Ciudad>temp=new ArrayList<Ciudad>();
			for(Ciudad c: temporal)
			{
				temp.add(c);
			}
			Ciudad tempc=temporal.get(i);
			temp.remove(tempc);
			tempc.setPosiblesCiudades(temp);
		}
		return new EnvironmentMap(numeroCiudades, ciudades, ciudadInicio, ciudadFinal);
	}

	/* (non-Javadoc)
	 * Metodo que obtiene del XML la informaci�n de las ciudades, guardando la ciudad inicial y final en cada atributo privado y 
	 * las demas ciudades en la lista.
	 * @see es.deusto.ingenieria.is.search.xml.StateXMLReader#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
	 * 
	 */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		//si el atributo de lista de ciudades está null lo creo.
		if(ciudades==null)
		{
			ciudades=new ArrayList<Ciudad>();
		}

		try {
			//De la etiqueta is:map obtengo el n�mero de ciudades
			if (qName.equals("is:map")) {
				this.numeroCiudades =Integer.parseInt(attributes.getValue("cities"));

			} else if (qName.equals("is:start")) {
				//Si es is:start la etiqueta, contiene la ciudad inicial
				ciudadInicio= new Ciudad(Integer.parseInt(attributes.getValue("x")), Integer.parseInt(attributes.getValue("y")),attributes.getValue("name"));
			} else if (qName.equals("is:end")) {
				//Si es is:end la etiqueta, contiene la ciudad final
				ciudadFinal= new Ciudad(Integer.parseInt(attributes.getValue("x")), Integer.parseInt(attributes.getValue("y")),attributes.getValue("name"));
			} else if (qName.equals("is:city")) {
				//Si es is:city la etiqueta, contiene una ciudad por la que hay que pasar
				Ciudad c= new Ciudad(Integer.parseInt(attributes.getValue("x")), Integer.parseInt(attributes.getValue("y")),attributes.getValue("name"));
				//añado la ciudad a la lista
				ciudades.add(c);
			}
		} catch (Exception ex) {
			System.out.println(this.getClass().getName() + ".startElement(): " + ex);
		}	
	}
}
